/**
 * Created by Dell on 2017/4/20.
 */
const users = require('../models/users');
const log = require('log4js').getLogger('users');
const systemlogs = require('../models/systemlogs');
const luosimao = require('../lib/luosimao');
const randomstring = require('randomstring');
const redisClient = require('../lib/redisClient');
const _ = require('lodash');
const settings = require('../config/settings');
const utils = require('../lib/utils');
const crypto = require('crypto');//加密时
const pg = require('../lib/pgClient');
const qr = require('qr-image');//二维码
/**
 * 后台新增用户
 * @param req
 * @param res
 */
exports.add_b = function(req, res){
     const args = req.body;
     if(!args.mobile){
         return res.send({success:false,data:'请填写手机号码'});
     };
     const params = [
         args.headurl?ags.headurl:null,//头像
         args.username?args.username:null,//用户名
         args.mobile,//手机号
         new Date(),//绑定日期
         0,//用户粉丝数
         0,//该用户发布作品数量
         0,//该用户关注的人的个数
         0,//用户想要的作品的数量
         0,//拥有的作品数量
         3,//用户状态未激活
         null,//用户密码，需要激活设置密码
         'member',//用户角色
         args.desc?args.desc:'这个懒家伙，没有任何说明'//用户签名
     ];
     const  phone = args.mobile;
     users.add_b(args, params, function(err, result) {
         if(err){
             return res.send({success:false,data:err});
         }else if(result == 'exit'){
             return res.send({success:false,data:'该手机号已存在，请更换手机号!'});
         }else if(result.rowCount == 0){//注册失败
             return res.send({success:false,data:'注册失败，请重新注册！'});
         }else {
             var compiled = _.template(settings.sms_conf.templates['register_user_b']);
             //执行发送验证码
             //log.debug(req.user.name)
             luosimao.sms(phone, compiled({verify_code: '张三'}), function (data) {

             });
             // luosimao.sms(phone, compiled({verify_code: req.user.name}), function (data) {
             //
             // });
             return res.send({sucess:true, data:'恭喜您注册成功,我们已经给手机号为 '+phone+' 的用户发送短信通知'})
         }
     });
};

/**
 *获取短信验证码
 *
 */
exports.get_code=function (req,res) {
    const user_code = req.body;
    if (!user_code.mobile) {
        return res.send({success: false, data: "请填写手机号码！"});
    }
    if (!user_code.code_type) {
        return res.send({success: false, data: "请填写验证类型"});
    }
    let randomNum = randomstring.generate({//生成四位验证码
        length: 4,
        charset: 'numeric'
    })
    log.debug(randomNum);
    if(user_code.code_type=='register'||user_code.code_type=='change_mobile'){//注册
        let sql = 'SELECT * FROM users WHERE mobile=$1';
        let params1=[
            user_code.mobile
        ];
        pg.query(sql ,params1 , function(err,result){
            if(err){
                log.error(err);
                return res.send({success:false,data:err});
            }else if(result.rowCount>0){
                log.error('该手机号已注册');
                return res.send({success:false,data:'该手机号已注册'});
            }else{
                let phone = user_code.mobile;
                // laodimao.sms(phone,'116033',[randomNum]);//发送短信
                log.debug('~~~~~~~~~~~~~~~~~~~~~~~~~');
                log.debug('userCode' + phone);
                log.debug('randomNum'+ randomNum);
                redisClient.hmset('userCode' + phone, 'phone', phone, 'randomNum', randomNum, function (err) {
                    log.debug(err);
                    if (err) {
                        log.debug(err);
                        return (err, null);
                    } else {
                        // console.log('randomNum'+ randomNum);
                        log.debug('randomNum'+ randomNum);
                        // log.error('randomNum'+ randomNum);
                        var compiled = _.template(settings.sms_conf.templates[user_code.code_type]);

                        //执行发送验证码
                        luosimao.sms(phone, compiled({verify_code: randomNum}), function (data) {

                        });

                        redisClient.expire('userCode' + phone, 900);//设置超时时间
                        // return ({msg:true, randomNum:''});
                        return res.send({success: true, data: '短信已发送至手机，请注意查收！'});
                    }

                })
            }
        })
    }else if(user_code.code_type=='lost_admin_password'){

            let sql = 'SELECT * FROM admin WHERE mobile=$1';
            let params1=[
                user_code.mobile
            ];
            pg.query(sql ,params1 , function(err,result){
                if(err){
                    log.error(err);
                    return res.send({success:false,data:err});
                }else if(result.rowCount == 0){
                    log.error('该手机号未注册');
                    return res.send({success:false,data:'该手机号未注册，请先注册'});
                }else{
                    let phone = user_code.mobile;
                    // laodimao.sms(phone,'116033',[randomNum]);//发送短信
                    log.debug('~~~~~~~~~~~~~~~~~~~~~~~~~');
                    log.debug('userCode' + phone);
                    log.debug('randomNum'+ randomNum);
                    redisClient.hmset('userCode' + phone, 'phone', phone, 'randomNum', randomNum, function (err) {
                        log.debug(err);
                        if (err) {
                            log.debug(err);
                            return (err, null);
                        } else {
                            // console.log('randomNum'+ randomNum);
                            log.debug('randomNum'+ randomNum);
                            // log.error('randomNum'+ randomNum);
                            var compiled = _.template(settings.sms_conf.templates[user_code.code_type]);

                            //执行发送验证码
                            luosimao.sms(phone, compiled({verify_code: randomNum}), function (data) {

                            });

                            redisClient.expire('userCode' + phone, 900);//设置超时时间
                            // return ({msg:true, randomNum:''});
                            return res.send({success: true, data: '短信已发送至手机，请注意查收！'});
                        }

                    })
                }
            })
    }else if(user_code.code_type=='active_admin'){

            let sql = 'SELECT * FROM admin WHERE mobile=$1';
            let params1=[
                user_code.mobile
            ];
            pg.query(sql ,params1 , function(err,result){
                if(err){
                    log.error(err);
                    return res.send({success:false,data:err});
                }else if(result.rowCount == 0){
                    log.error('该手机号未注册');
                    return res.send({success:false,data:'该手机号未注册，请先注册'});
                }else if(result.rows[0].password){
                    log.error('该手机号已注册');
                    return res.send({success:false,data:'该手机号已注册'});
                }else{
                    let phone = user_code.mobile;
                    // laodimao.sms(phone,'116033',[randomNum]);//发送短信
                    log.debug('~~~~~~~~~~~~~~~~~~~~~~~~~');
                    log.debug('userCode' + phone);
                    log.debug('randomNum'+ randomNum);
                    redisClient.hmset('userCode' + phone, 'phone', phone, 'randomNum', randomNum, function (err) {
                        log.debug(err);
                        if (err) {
                            log.debug(err);
                            return (err, null);
                        } else {
                            // console.log('randomNum'+ randomNum);
                            log.debug('randomNum'+ randomNum);
                            // log.error('randomNum'+ randomNum);
                            var compiled = _.template(settings.sms_conf.templates[user_code.code_type]);

                            //执行发送验证码
                            luosimao.sms(phone, compiled({verify_code: randomNum}), function (data) {

                            });

                            redisClient.expire('userCode' + phone, 900);//设置超时时间
                            // return ({msg:true, randomNum:''});
                            return res.send({success: true, data: '短信已发送至手机，请注意查收！'});
                        }

                    })
                }
            })
    }else if(user_code.code_type=='bind_mobile'){
        let sql = 'SELECT * FROM users WHERE mobile=$1';
        let params1=[
            user_code.mobile
        ];
        pg.query(sql ,params1 , function(err,result){
            if(err){
                log.error(err);
                return res.send({success:false, singin: false, data:err});
            }else if(result.rowCount == 0){
                let phone = user_code.mobile;
                // laodimao.sms(phone,'116033',[randomNum]);//发送短信
                log.debug('~~~~~~~~~~~~~~~~~~~~~~~~~');
                log.debug('userCode' + phone);
                log.debug('randomNum'+ randomNum);
                redisClient.hmset('userCode' + phone, 'phone', phone, 'randomNum', randomNum, function (err) {
                    log.debug(err);
                    if (err) {
                        log.debug(err);
                        return (err, null);
                    } else {
                        // console.log('randomNum'+ randomNum);
                        log.debug('randomNum'+ randomNum);
                        // log.error('randomNum'+ randomNum);
                        var compiled = _.template(settings.sms_conf.templates[user_code.code_type]);

                        //执行发送验证码
                        luosimao.sms(phone, compiled({verify_code: randomNum}), function (data) {

                        });

                        redisClient.expire('userCode' + phone, 900);//设置超时时间
                        // return ({msg:true, randomNum:''});
                        return res.send({success: true, singin: false, data: '短信已发送至手机，请注意查收！'});
                    }
                })
            }else if(result.rows[0].wxinfo.openid){
                log.error('该手机号已注册');
                return res.send({success:false, singin: true, data:'该手机号已注册'});
            }else{
                let phone = user_code.mobile;
                // laodimao.sms(phone,'116033',[randomNum]);//发送短信
                log.debug('~~~~~~~~~~~~~~~~~~~~~~~~~');
                log.debug('userCode' + phone);
                log.debug('randomNum'+ randomNum);
                redisClient.hmset('userCode' + phone, 'phone', phone, 'randomNum', randomNum, function (err) {
                    log.debug(err);
                    if (err) {
                        log.debug(err);
                        return (err, null);
                    } else {
                        // console.log('randomNum'+ randomNum);
                        log.debug('randomNum'+ randomNum);
                        // log.error('randomNum'+ randomNum);
                        var compiled = _.template(settings.sms_conf.templates[user_code.code_type]);

                        //执行发送验证码
                        luosimao.sms(phone, compiled({verify_code: randomNum}), function (data) {

                        });

                        redisClient.expire('userCode' + phone, 900);//设置超时时间
                        // return ({msg:true, randomNum:''});
                        return res.send({success: true, singin: true, data: '短信已发送至手机，请注意查收！'});
                    }

                })
            }
        })
    }
    else {
        let phone = user_code.mobile;
        let sql2 = 'SELECT * FROM users WHERE mobile=$1';
        let params2=[
            user_code.mobile
        ];
        pg.query(sql2 ,params2 , function(err,result){
            if(err){
                log.error(err);
                return res.send({success:false,data:err});
            }else if(result.rowCount>0){
                // laodimao.sms(phone,'116033',[randomNum]);//发送短信
                log.debug('~~~~~~~~~~~~~~~~~~~~~~~~~');
                log.debug('userCode' + phone);
                redisClient.hmset('userCode' + phone, 'phone', phone, 'randomNum', randomNum, function (err) {
                    log.debug(err);
                    log.debug('randomNum'+ randomNum);
                    if (err) {
                        return (err, null);
                    } else {
                        var compiled = _.template(settings.sms_conf.templates[user_code.code_type]);
                        //执行发送验证码
                        luosimao.sms(phone, compiled({verify_code: randomNum}), function (data) {
                        });

                        redisClient.expire('userCode' + phone, 900);//设置超时时间
                        // return ({msg:true, randomNum:''});
                        return res.send({success: true, data: '短信已发送至手机，请注意查收！'});
                    }
                })
            }else{
                log.error('该手机号未注册');
                return res.send({success:false,data:'该手机号未注册，请先注册！'});
            }
        })


    }
};
// /**
//  *验证短信验证码是否正确
//  *
//  */
// exports.verify =function (req,res) {
//     const new_user = req.body;
//     console.log(new_user);
//     log.debug(new_user);
//     if(!new_user.code)
//     {
//         return res.send({success:false,data:"请填写验证码!"});
//     }
//     if(!new_user.mobile){
//         return res.send({success:false,data:"请填写手机号码！"});
//     }
//     if(!new_user.code_type){
//         return res.send({success:false,data:'请填选择服务项'})
//     }
//     let phone = new_user.mobile;
//     const params = [new_user.mobile];
//     // laodimao.sms(phone,'116033',[randomNum]);//发送短信
//     console.log('~~~~~~~~~~~~~~~~~~~~~~~');
//     console.log('userCode'+phone);
//     redisClient.hmget('userCode'+phone,'randomNum',function(err,reply){
//         console.log('~~~~~~~~~~~~~~~~~~~~~~~');
//         console.log(reply);
//         if(reply[0] ==new_user.code ){
//             if(new_user.code_type=='register'){
//                 return res.send({success:true,data:'验证码输入正确'});
//             }else if(new_user.code_type=='lost_password'||new_user.code_type=='change_password'||new_user.code_type=='change_mobile'||new_user.code_type=='active_user'){
//                 users.verify(params, function (err, result) {
//                     if (err) {
//                         log.error(err);
//                         return res.send({success: false, data: err});
//                     } else if (result==null) {
//                         log.error('您输入的手机号未注册');
//                         return res.send({success: false, data: '您输入的手机号未注册！'});
//                     } else {
//                         return res.send({success: true, data:result.rows[0]});
//                     }
//                 })
//             }else{
//                 return res.send({success:false,data:'您输入的不在服务范围'});
//             }
//         }else{
//             log.error('验证码不正确');
//             return res.send({success:false,data:'验证码不正确'});
//         }
//     });
// };
/**
 *用户激活
 *
 */
exports.active_user=function (req,res) {
    const new_user = req.body;
    console.log(new_user);
    if(!new_user.code)
    {
        return res.send({success:false,data:"请填写验证码!"});
    }
    if(!new_user.mobile){
        return res.send({success:false,data:"请填写手机号码！"});
    }
    if(!new_user.password){
        return res.send({success:false,data:"请填写密码!"});
    }
    if(!new_user.comf_password){
        return res.send({success:false,data:"请确认密码!"});
    }
    if(new_user.password!=new_user.comf_password){
        return res.send({success:false,data:'两次输入的密码不一致'});
    }
    let phone = new_user.mobile;
    let new_password = crypto.createHash('sha256').update(new_user.password).digest('hex');//对密码进行加密
    log.debug(new_password);
    const params =[
        new_password,
        1,
        phone
    ];
    // laodimao.sms(phone,'116033',[randomNum]);//发送短信
    console.log('~~~~~~~~~~~~~~~~~~~~~~~');
    console.log('userCode'+phone);
    redisClient.hmget('userCode'+phone,'randomNum',function(err,reply){//获取验证码
        console.log('~~~~~~~~~~~~~~~~~~~~~~~');
        console.log(reply);
        if(reply[0] ==new_user.code ){//对比验证码
            users.active_user(params, new_user, function (err, result) {
                if(err){
                    log.debug(err);
                    res.send({success:false,data:err});
                }else if(result==null){
                    log.error('该手机号未注册');
                    res.send({success:false,data:"该手机号未注册，请确认手机号码！"});
                }else if(result=='exit'){
                    log.error('该手机号已激活');
                    res.send({success:false,data:"该账号已激活，请不要重复激活！"});
                }else if(result.rowCount>=1){
                    res.send({success:true,data:"恭喜您，账号激活成功！"});
                }else{
                    log.error('用户注册失败');
                    res.send({success:false,data:"很遗憾，账号激活失败，请重试！"});
                }
                // res.send({success:true,data:result});

            });
        }else{
            log.error('验证码不正确');
            return res.send({success:false,data:'验证码不正确，请确认验证码'});
        }
    });
};
/**
 * 后台多条件查询用户列表
 * @param req
 * @param res
 */
exports.list_b= function(req,res){
    let date = new Date();
    let nowYear = date.getFullYear();
    let nowMonth = date.getMonth() + 1;  //注意getMonth从0开始
    let nowDay = date.getDate();
    let d1=nowYear + ',' + nowMonth + ',' + nowDay ;   //将当前日期的年月日整合到d中
    let d2=new Date(new Date(d1).getTime() - 86400000);   //将当前日期的年月日整合到d中
    let d3=new Date(new Date(d1).getTime() - (86400000*2));   //将当前日期的年月日整合到d中
    let d4=new Date(new Date(d1).getTime() - (86400000*7));   //将当前日期的年月日整合到d中
    let d5=new Date(new Date(d1).getTime() - (86400000*30));   //将当前日期的年月日整合到d中
    let date1 = new Date(d1);   //获取当日00：00：00的标准时间
    let date2 = new Date(d2);   //获取昨日00：00：00的标准时间
    let date3 = new Date(d3);   //获取前天00：00：00的标准时间
    let date4 = new Date(d4);   //获取一周前00：00：00的标准时间
    let date5 = new Date(d5);   //获取30天前00：00：00的标准时间
    const args = req.query;
    const limit = args.limit?Number(args.limit):10;//严格规定未数字格式
    const page = args.page?args.page:1;//严格规定为数字格式
    let params = [];
    if(args.status){//状态搜索
        params.push(args.status);
    };
    if(args.keyword){//关键字搜索，模糊查询
        params.push('%'+args.keyword+'%');
    };
    if(args.createtime == 'new'){
        params.push(date2),//昨日新增
            params.push(date1)//当日新增
    }
    if(args.createtime == 'yesterday'){
        params.push(date3),//前天新增
            params.push(date2)//昨天新增
    }
    if(args.createtime == 'weak'){
        params.push(date4),//一周新增
            params.push(date1)//当日新增
    }
    if(args.createtime == 'month'){
        params.push(date5),//30天新增
            params.push(date1)//当日新增
    }
    params.push(limit);//每页显示多少条
    params.push((Number(page) - 1)*limit);//滤过多少条
    users.list_b (params, args, function(err,result){
        if(err){
            return res.send({success:false,data:err});
        }else {
            return res.send({success:true,data:result.rows});//摘取rows有用信息
        }
    })
};
/**
 * 后台多条件查询用户列表数据统计
 * @param req
 * @param res
 */
exports.count_b= function(req,res){
    let date = new Date();
    let nowYear = date.getFullYear();
    let nowMonth = date.getMonth() + 1;  //注意getMonth从0开始
    let nowDay = date.getDate();
    let d1=nowYear + ',' + nowMonth + ',' + nowDay ;   //将当前日期的年月日整合到d中
    let d2=new Date(new Date(d1).getTime() - 86400000);   //将当前日期的年月日整合到d中
    let d3=new Date(new Date(d1).getTime() - (86400000*2));   //将当前日期的年月日整合到d中
    let d4=new Date(new Date(d1).getTime() - (86400000*7));   //将当前日期的年月日整合到d中
    let d5=new Date(new Date(d1).getTime() - (86400000*30));   //将当前日期的年月日整合到d中
    let date1 = new Date(d1);   //获取当日00：00：00的标准时间
    let date2 = new Date(d2);   //获取昨日00：00：00的标准时间
    let date3 = new Date(d3);   //获取前天00：00：00的标准时间
    let date4 = new Date(d4);   //获取一周前00：00：00的标准时间
    let date5 = new Date(d5);   //获取30天前00：00：00的标准时间
    const args = req.query;
    let params = [];
    if(args.status){//状态搜索
        params.push(args.status);
    };
    if(args.keyword){//关键字搜索，模糊查询
        params.push('%'+args.keyword+'%');
    };
    if(args.createtime == 'new'){
        params.push(date2),//昨日新增
            params.push(date1)//当日新增
    }
    if(args.createtime == 'yesterday'){
        params.push(date3),//前天新增
            params.push(date2)//昨天新增
    }
    if(args.createtime == 'weak'){
        params.push(date4),//一周新增
            params.push(date1)//当日新增
    }
    if(args.createtime == 'month'){
        params.push(date5),//30天新增
            params.push(date1)//当日新增
    }

    users.count_b (params, args, function(err,result){
        if(err){
            return res.send({success:false,data:err});
        }else {
            return res.send({success:true,data:result});//返回的数据已经经过处理
        }
    });
};
/**
 * 后台批量编辑用户状态
 * @param req
 * @param res
 */
exports.upd_status = function(req,res){
    const args = req.body;
    const ids = args.ids;
    if(!args.ids){//要编辑的用户id
        return res.send({success:false,data:'请填写要编辑的用户的id'});
    }
    if(!args.status){//要编辑的状态
        return res.send({success:false,data:'请选择要编辑的状态'});
    }
    if(args.status!=1&&args.status!=2){//严格控制要编辑的状态
        return res.send({success:false,data:'对不起，您编辑的状态不符合规矩，状态只能是【正常、禁用】'});
    }
    if(args.ids.constructor != Array){//判断是否传的数组类型的
        return res.send({succeaa:false,data:'请以数组方式传递要编辑的的用户的id！'});
    }
    users.upd_status(args, function(err, result){
        if(err){
            return res.send({success:false, data:err});
        }else if(result == 'fail'){
            return res.send({success:false, data:'您的选项中，含有未激活用户，请确认后重试'});
        }else if(result.rowCount == 0){
            return res.send({success:false, data:'很遗憾，编辑失败，请重新编辑'});
        }else {
            let desc = req.user.username+'编辑了一批app用户状态';
            const params_sys = [
                req.user.id,
                desc,
                new Date(),
                2
            ];
            systemlogs.add_systemlogs(params_sys, function(err, result){});//添加日志
            return res.send({success:true,data:'恭喜您，编辑成功！'});
        }
    });
};
/**
 * 前台用户登录系统
 * @param req
 * @param res
 */
exports.log_in=function(req,res){
    const log_info = req.body;
    if(!log_info.mobile){
        return res.send({success:false,data:'请填写手机号码！'});
    }
    if(!log_info.password){
        return res.send({success:false,data:'请填写登录密码！'});
    }
    let new_password = crypto.createHash('sha256').update(log_info.password).digest('hex');//密码加密
    const params = [
        new_password
    ];
    users.log_in(params,log_info,function(err,result){//查用户
        if(err){
            log.error(err);
            return res.send({success:false,data:err});
        }else{

            if(result==null){//未注册
                log.error('该手机号未注册，请先注册');
                return res.send({success:false,data:"该手机号未注册,请先注册！"});
            }else if(result=='wrong_password'){//密码不正确
                log.error('密码错误，请重新输入');
                return res.send({success:false,data:"密码错误，请重新输入！"});
            }else if(result=='wrong_status'){//账号被禁用
                log.error('账号被禁用');
                return res.send({success:false,data:'对不起，您的账号已经被管理员禁用，暂时不可用'});
            }else{
                let user = result.rows[0];
                let token = {user: {id: user.id, username: user.username, mobile: user.mobile}, scopes: utils.getUserScopes(user), access_token: utils.uid(255), refresh_token: utils.uid(255)}; //生成token
                log.debug(token);
                redisClient.set(token.access_token, JSON.stringify(token), function(err){ //保存token到redis
                    redisClient.expire(token.access_token, settings.oauth_conf.tokenLife);
                    if (err) {
                        log.error('登录失败，请重新登录');
                        return res.send({success:false,data:"登录失败，请重试！"});
                    }else{
                        delete user.password; //删除密码属性
                        return res.send({
                            success:true,
                            info: {
                                user: user,
                                permissions: utils.getPermissions(user.role),
                                access_token: token.access_token,
                                refresh_token: token.refresh_token

                            }, data:'欢迎登录奇妙汇!'});
                    }
                });
                // return res.send({success:true,data:'欢迎登录全民康健康理疗!'});
            }
        }
    });
};



/**
 * 前台用户更新token
 * @param req
 * @param res
 */
exports.update_token=function(req,res){
    const user = req.user;
    const params = [
        req.user.id
    ];
    redisClient.get(req.body.refresh_token, function (err, reply) {
        if (err) {
            console.log(err);
            return res.send(500);
        }
        if (reply) {
            res.send(401);
        }
        else {
            users.update_token(params,function(err,result){
                if(err){
                    log.error(err);
                    return res.send({success:false,data:err});
                }else{
                    if(result==null){
                        log.error('该手机号未注册，请先注册');
                        return res.send({success:false,data:"该手机号未注册,请先注册！"});
                    }else{
                        let user = result.rows[0];
                        let token = {user: {id: user.id, username: user.username, birthday: user.birthday, sex: user.sex}, scopes: utils.getUserScopes(user), access_token: utils.uid(255), refresh_token: utils.uid(255)}; //生成token
                        log.debug(token);
                        redisClient.set(token.access_token, JSON.stringify(token), function(err){ //保存token到redis
                            redisClient.expire(token.access_token, settings.oauth_conf.tokenLife);
                            if (err) {
                                log.error('登录失败，请重新登录');
                                return res.send({success:false,data:"登录失败，请重试！"});
                            }else{
                                delete user.password; //删除密码属性
                                return res.send({
                                    success:true,
                                    info: {
                                        user: user,
                                        permissions: utils.getPermissions(user.role),
                                        access_token: token.access_token,
                                        refresh_token: token.refresh_token

                                    }, data:'欢迎登录奇妙汇!'});
                            }
                        });
                    }
                }
            })
        }
    });

};
/**
 *批量删除app用户
 * @param req
 * @param res
 */
exports.remove = function(req, res){
    const args = req.body;
    const ids = args.ids;
    if(args.ids.constructor != Array){//判断是否传的数组类型的
        return res.send({succeaa:false,data:'请以数组方式传递要删除的用户id！'});
    }
    users.remove(args, function(err,result){
        if(err){
            return res.send({success:false,data:err});
        }else if(result == null){//不存在
            return res.send({success:false,data:'很遗憾，您删除用户不存在！'});
        }else if(result.rowCount == 0){//失败
            return res.send({success:false,data:'很遗憾，您删除用户信息失败！'});
        }else {
            let desc = req.user.username+'删除了一批app用户';
            const params_sys = [
                req.user.id,
                desc,
                new Date(),
                2
            ];
            systemlogs.add_systemlogs(params_sys, function(err, result){});//添加日志
            return res.send({success:true,data:'恭喜您，删除用户信息成功！'});
        }
    });
};
/**
 *用户注册
 *
 */
exports.add_user=function (req,res) {
    const new_user = req.body;
    console.log(new_user);
    if(!new_user.code)
    {
        return res.send({success:false,data:"请填写验证码!"});
    }
    if(!new_user.mobile){
        return res.send({success:false,data:"请填写手机号码！"});
    }
    if(!new_user.password){
        return res.send({success:false,data:"请填写密码!"});
    }
    if(!new_user.comf_password){
        return res.send({success:false,data:"请确认密码!"});
    }
    if(!new_user.username)
    {
        return res.send({success:false,data:"请填写用户名!"});
    }
    // if(!new_user.sex){
    //     return res.send({success:false,data:"请填写性别！"});
    // }
    // if(!new_user.birthday){
    //     return res.send({success:false,data:"请填写您的生日!"});
    // }
    // if(!new_user.address){
    //     return res.send({success:false,data:"请填写您的地址!"});
    // }
    // if(!new_user.email){
    //     return res.send({success:false,data:"请填写您的邮箱!"});
    // }
    if(new_user.password!=new_user.comf_password){
        return res.send({success:false,data:'两次输入的密码不一致'});
    }

    let phone = new_user.mobile;
    let new_password = crypto.createHash('sha256').update(new_user.password).digest('hex');
    log.debug(new_password);
    const params =[
        new_user.headurl?new_user.headurl:null,
        new_user.username,
        new_user.mobile,
        new Date(),
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        new_password,
        'member',    //用户角色
        new_user.desc?new_user.desc:null,//描述
        new_user.sex?new_user.sex:null,
        new_user.birthday?new Date(new_user.birthday):null,
        new_user.address?new_user.address:null,
        new_user.email?new_user.email:null,
        new_user.wxinfo ? new_user.wxinfo : {}, //微信用户信息
    ];
    // laodimao.sms(phone,'116033',[randomNum]);//发送短信
    console.log('~~~~~~~~~~~~~~~~~~~~~~~');
    console.log('userCode'+phone);
    redisClient.hmget('userCode'+phone,'randomNum',function(err,reply){
        console.log('~~~~~~~~~~~~~~~~~~~~~~~');
        console.log(reply);
        if(reply[0] ==new_user.code ){
            users.add_user(params,new_user, function (err, result) {
                if(err){
                    log.debug(err);
                    res.send({success:false,data:err});
                }else{
                    if(result==null){
                        log.error('该手机号已注册');
                        res.send({success:false,data:"该手机号已注册，请重试！"});
                    }
                    else if(result.rowCount>=1){
                        res.send({success:true,data:"用户注册成功！"});
                    }
                    else if(result=='exit'){
                        res.send({success:true,data:"该用户名已被注册，请重试！"});
                    }else{
                        log.error('用户注册失败');
                        res.send({success:false,data:"用户注册失败！"});
                    }
                    // res.send({success:true,data:result});
                }
            });
        }else{
            log.error('验证码不正确');
            return res.send({success:false,data:'验证码不正确'});
        }
    });
};
/**
 *忘记密码
 *
 */
exports.lost_password=function (req,res) {
    const args = req.body;
    if(!args.mobile){
        return res.send({success:false,data:"请填写手机号码！"});
    }
    if(!args.password){
        return res.send({success:false,data:"请填写密码!"});
    }
    if(!args.comf_password){
        return res.send({success:false,data:"请确认密码!"});
    }
    if(!args.code) {
        return res.send({success:false,data:"请填写验证码!"});
    }
    if(args.password!=args.comf_password){
        return res.send({success:false,data:'两次输入的密码不一致'});
    }
    let phone = args.mobile;
    let new_password = crypto.createHash('sha256').update(args.password).digest('hex');//密码加密
    log.debug(new_password);
    const params =[
        new_password,
        args.mobile,
    ];
    redisClient.hmget('userCode'+phone,'randomNum',function(err,reply){//查短信验证码
        console.log('~~~~~~~~~~~~~~~~~~~~~~~');
        console.log(reply);
        if(reply[0] ==args.code ) {//对比短息验证码
            users.lost_password(params,args, function (err, result) {//去models中执行修改密码操作
                if(err){
                    log.debug(err);
                    res.send({success:false,data:err});
                }else{
                    if(result==null){
                        log.error('该手机号未注册');
                        res.send({success:false,data:"该手机号未注册！"});
                    }
                    else if(result.rowCount>=1){
                        res.send({success:true,data:"找回密码成功！"});
                    }else{
                        log.error('找回密码失败');
                        res.send({success:false,data:"找回密码失败！"});
                    }
                }
            });
        }else {
            return res.send({success:false,data:'验证码错误，请重试！'});
        }
    });
};

/**
 *修改密码
 *
 */
exports.change_password=function (req,res) {
    const args = req.body;
    if(!args.mobile){
        return res.send({success:false,data:"请填写手机号码！"});
    }
    if(!args.password){
        return res.send({success:false,data:"请填写密码!"});
    }
    if(!args.comf_password){
        return res.send({success:false,data:"请确认密码!"});
    }
    if(!args.code) {
        return res.send({success:false,data:"请填写验证码!"});
    }
    if(args.password!=args.comf_password){
        return res.send({success:false,data:'两次输入的密码不一致'});
    }
    let phone = args.mobile;
    let new_password = crypto.createHash('sha256').update(args.password).digest('hex');//密码加密
    log.debug(new_password);
    const params =[
        new_password,
        args.mobile,
    ];
    redisClient.hmget('userCode'+phone,'randomNum',function(err,reply){//查短信验证码
        console.log('~~~~~~~~~~~~~~~~~~~~~~~');
        console.log(reply);
        if(reply[0] ==args.code ) {//对比短息验证码
            users.lost_password(params,args, function (err, result) {//去models中执行修改密码操作
                if(err){
                    log.debug(err);
                    res.send({success:false,data:err});
                }else{
                    if(result==null){
                        log.error('该手机号未注册');
                        res.send({success:false,data:"该手机号未注册！"});
                    }
                    else if(result.rowCount>=1){
                        res.send({success:true,data:"修改密码成功！"});
                    }else{
                        log.error('修改密码失败');
                        res.send({success:false,data:"修改密码失败！"});
                    }
                }
            });
        }else {
            return res.send({success:false,data:'验证码错误，请重试！'});
        }
    });
};
/**
 *修改密码
 *
 */
exports.change_mobile=function (req,res) {
    const args = req.body;
    // if(!args.oldmobile){
    //     return res.send({success:false,data:"请填写原手机号码！"});
    // }
    if(!args.newmobile){
        return res.send({success:false,data:"请填写新手机号码！"});
    }
    if(!args.code) {
        return res.send({success:false,data:"请填写验证码!"});
    }
    let phone = args.newmobile;
    const params =[
        args.newmobile,
        req.user.id
    ];
    redisClient.hmget('userCode'+phone,'randomNum',function(err,reply){//查短信验证码
        console.log('~~~~~~~~~~~~~~~~~~~~~~~');
        console.log(reply);
        if(reply[0] ==args.code ) {//对比短息验证码
            users.change_mobile(params,args, function (err, result) {//去models中执行修改密码操作
                if(err){
                    log.debug(err);
                    res.send({success:false,data:err});
                }else{
                    if(result==null){
                        log.error('修改手机号失败');
                        res.send({success:false,data:"修改手机号失败！"});
                    }
                    else if(result.rowCount>=1){
                        res.send({success:true,data:"修改手机号成功！"});
                    }
                    else if(result=='exit'){
                        res.send({success:true,data:"您要修改的手机号已经注册！"});
                    }else{
                        log.error('修改手机号失败');
                        res.send({success:false,data:"修改手机号失败！"});
                    }
                }
            });
        }else {
            return res.send({success:false,data:'验证码错误，请重试！'});
        }
    });
};

/**
 * 单个用户详情
 * @param req
 * @param res
 */
exports.user_info=function(req,res){
    const params =[req.user.id];
    users.user_info(params,function(err,result){
        if(err) {
            log.error(err);
            return res.send({success: false, data: err});
        }else if(result==null){
            log.error('未找到该用户');
            return res.send({success:false,data:'未找到该用户！'});
        }
        else{
            delete result.rows[0].password; //删除密码属性
            return res.send({success:true,data:result.rows[0]});
        }
    });
};
/**
 * app更新用户信息
 * @param req
 * @param res
 * @returns {*}
 */
exports.update_one_user=function(req,res){
    const user_info = req.body;
    const params = [];
    if(user_info.headimgurl){
        params.push(user_info.headimgurl);
    }
    if(user_info.desc){
        params.push(user_info.desc);
    }
    if(user_info.sex){
        params.push(user_info.sex);
    }
    if(user_info.birthday){
        params.push(new Date(user_info.birthday));
    }
    if(user_info.address){
        params.push(user_info.address);
    }
    if(user_info.email){
        params.push(user_info.email);
    }
    params.push(req.user.id);
    users.update_one_user(params,user_info,function(err,result){
        if(err){
            log.error(err);
            return res.send({success:false,data:err});
        }else{
            if(result==null){
                log.error('该手机号未注册，请先注册');
                return res.send({success:false,data:"该手机号未注册,请先注册！"});
            }else{
                return res.send({success:true,data:'修改成功!'});
            }
        }
    })
};


/**
 * app更新用户信息
 * @param req
 * @param res
 * @returns {*}
 */
exports.update_username=function(req,res){
    const args = req.body;
    const params = [
        args.username,
        req.user.id
    ];
    users.update_username(params, function(err,result){
        if(err){
            log.error(err);
            return res.send({success:false,data:err});
        }else if(result=='exit'){
            log.error('该用户名已注册，请更换用户名');
            return res.send({success:false,data:"该用户名已注册，请更换用户名"});
        }else if(result=='fail'){
            log.error('修改用户名失败，请重试！');
            return res.send({success:false,data:"修改用户名失败，请重试！"});
        }else{
            return res.send({success:true,data:'修改成功!'});
        }
    });
};
/**
 * 不同分类当日排行榜
 * @param req
 * @param res
 */
exports.rankings = function (req, res){
    const args = req.query;
    users.rankings(req, args, function(err, result){//去models中处理数据
        if(err){
            return res.send({success:false,data:err});//报错
        }else {
            return res.send({success:true,data:result});//经过处理后的数据
        }
    });
};
/**
 * app关注用户
 * @param req
 * @param req
 */
exports.attracted = function(req, res){
    const args = req.body;
    if(!req.user){
        return res.snd({success:false,data:'您尚未登录，请先注册并登录'});
    }
    if(!args.userid){
        return res.send({success:false,data:'请选择要关注的用户'});
    };
    if(args.userid == req.user.id){
        return res.send({success:false,data:'您不能自己关注自己'});
    }
    const params = [
        req.user.id,//添加关注的人的id
        args.userid,//被关注的人的id
        new Date()//添加关注的时间
    ];
    users.attracted(params, function(err, result){
        if(err){
            return res.send({success:false,data:err});
        }else if(result == 'null_puser'){
            return res.send({success:false,data:"您关注的用户不存在"});
        }else if (result == 'null_user'){
            return res.send({success:false,data:'您的账户信息有误'});
        }else if (result == null){
            return res.send({success:false,data:'添加关注失败，请重试'});
        }else if (result == 'exit_logs'){
            return res.send({success:false,data:'您已对该用户添加关注，请不要重复关注'});
        }else {
            return res.send({success:true,data:'恭喜您，添加关注成功'});
        }
    });
};
/**
 * app取消关注用户
 * @param req
 * @param req
 */
exports.unattracte = function(req, res){
    const args = req.body;
    if(!req.user){
        return res.snd({success:false,data:'您尚未登录，请先注册并登录'});
    }
    if(!args.userid){
        return res.send({success:false,data:'请选择要关注的用户'});
    };
    const params = [
        req.user.id,//添加关注的人的id
        args.userid,//被关注的人的id
        new Date()//添加关注的时间
    ];
    users.unattracte(params, function(err, result){
        if(err){
            return res.send({success:false,data:err});
        }else if(result == 'null_puser'){
            return res.send({success:false,data:"您要取消关注的用户不存在"});
        }else if (result == 'null_user'){
            return res.send({success:false,data:'您的账户信息有误'});
        }else if (result == null){
            return res.send({success:false,data:'取消关注失败，请重试'});
        }else {
            return res.send({success:true,data:'取消关注成功'});
        }
    });
};
/**
 * 一个用户的详情
 * @param req
 * @param res
 */
exports.one_user_info = function(req, res){
    const args = req.query;
    if(!args.userid){
        return res.send({success:false,data:'请选择要查看的用户'});
    }
    const params = [args.userid, 1];
    users.one_user_info(params, req, function(err, result){
        if(err){
            return res.send({success:false,data:err});
        }else if(result == 'null'){
            return res.send({success:false,data:'用户信息有无，请重试'});
        }else {
            return res.send({success:true,data:result});
        }
    })
};

/**
 * 推荐的用户
 * @param req
 * @param res
 */
exports.top = function(req, res){
    const args = req.query;
    users.top(req, args, function(err, result){//去models中处理数据
        if(err){
            return res.send({success:false,data:err});//报错
        }else {
            return res.send({success:true,data:result});//经过处理后的数据
        }
    });
};
/**
 * 用户分享app
 * @param req
 * @param res
 */
exports.share = function(req, res){
    const args = req.body;
    var content;
    if(!args.shareapp){
        return res.send({success:false,data:'请选择要分享的工具'});
    }
    if(args.shareapp == 'qq好友'){
        content = '好友通过qq分享到好友';
    }
    if(args.shareapp == '微信好友'){
        content = '好友通过微信分享到好友';
    }
    if(args.shareapp == '微信朋友圈'){
        content = '好友通过微信分享到朋友圈';
    }
    let params = [
        req.user.id,
        args.shareapp,
        content,
        new Date()
    ];
    users.share(params, function(err, result){
        if(err){
            return res.send({success:false,data:err});
        }else if (result == 'fail'){
            return res.send({success:false,data:'分享失败'});
        }else {
            return res.send({success:true,data:'分享成功'});
        }
    });
};
exports.image =  function (req, res, next) {
    var text = req.query.text;
    try {
        var img = qr.image(text,{size :10});
        res.writeHead(200, {'Content-Type': 'image/png'});
        img.pipe(res);
    } catch (e) {
        res.writeHead(414, {'Content-Type': 'text/html'});
        res.end('<h1>414 Request-URI Too Large</h1>');
    }
};

/**
 * 修改用户微信信息
 * @param req
 * @param res
 * @returns {*}
 */
exports.update_wx = function (req,res) {
    const args = req.body;
    if(!args.wxinfo){
        return res.send({success:false,data:'请填写要绑定的微信信息'});
    }
    if(!args.mobile){
        return res.send({success:false,data:'请填写手机号'});
    }
    const params = [
        args.wxinfo,
        args.mobile
    ];
    users.update_wx(params, args, function(err,result){
        if(err){
            log.error(err);
            return res.send({success:false,data:err});
        }else if(result=='fail'){
            log.error('修改微信信息失败');
            return res.send({success:false,data:'修改微信信息失败'});
        }else if(result == null){
            log.error('您的账号信息错误');
            return res.send({success:false,data:'您的账户信息错误'});
        }else {
            let user = result;
            let token = {user: {id: user.id, username: user.username, mobile: user.mobile}, scopes: utils.getUserScopes(user), access_token: utils.uid(255), refresh_token: utils.uid(255)}; //生成token
            log.debug(token);
            redisClient.set(token.access_token, JSON.stringify(token), function(err){ //保存token到redis
                redisClient.expire(token.access_token, settings.oauth_conf.tokenLife);
                if (err) {
                    log.error('登录失败，请重试');
                    return res.send({success:false,data:"登录失败，请重试！"});
                }else{
                    delete user.password; //删除密码属性
                    return res.send({
                        success:true,
                        info: {
                            user: user,
                            permissions: utils.getPermissions(user.role),
                            access_token: token.access_token,
                            refresh_token: token.refresh_token

                        }, data:'欢迎登录奇妙汇!'});
                }
            });
        }
    })
};
/**
 * 修改用户微信信息
 * @param req
 * @param res
 * @returns {*}
 */
exports.wx_login = function (req,res) {
    const args = req.query;
    const openid=args.openid;
    users.get_user_openid(openid, function (err, user) { //从本地数据库查询是否已经注册
        if(err){
            logger.debug(err);
            return res.send({success: false, error: err});
        }
        if(user.rowCount == 0){
            res.send({success: true, signin: false, data: "请绑定手机号"}); //未注册
        }else{
            let theuser = user.rows[0];
            let token = {user: {id: theuser.id, username: theuser.username}, scopes: utils.getUserScopes(theuser), access_token: utils.uid(255), refresh_token: utils.uid(255)}; //生成token
            log.debug(token);
            redisClient.set(token.access_token, JSON.stringify(token), function(err) { //保存token到redis
                redisClient.expire(token.access_token, settings.oauth_conf.tokenLife);
                if (err) {
                    return res.send({success: false, data: "登录失败，请重试！"});
                } else {
                    delete theuser.password; //删除密码属性
                    return res.send({
                        success: true,
                        info: {
                            user: theuser,
                            permissions: utils.getPermissions(theuser.role),
                            access_token: token.access_token,
                            refresh_token: token.refresh_token

                        },
                        signin: true,
                        data: theuser
                    });
                }
            })
            // res.send({success: true, signin: true,data: user.rows[0]}); //已注册
        }
    });
};

/**
 * app用户绑定手机号
 * @param req
 * @param res
 */
exports.bind_mobile = function(req, res){
    const args = req.body;
    if(!args.mobile){
        return res.send({success:false,data:"请填写要绑定的手机号码！"});
    }
    if(!args.code) {
        return res.send({success:false,data:"请填写验证码!"});
    }
    if(!args.password) {
        return res.send({success:false,data:"请填写密码!"});
    }
    if(!args.wxinfo){
        return res.send({success:false,data:'请填写微信信息'});
    }
    // if(!args.username){
    //     return res.send({success:false,data:'请填写用户名'});
    // }
    let new_password = crypto.createHash('sha256').update(args.password).digest('hex');
    let phone = args.mobile;
    // const params =[
    //     args.mobile,
    //     new_password,
    //     req.user.id
    // ];
    let wxinfo = args.wxinfo;
    if(typeof (wxinfo) =='string'){
        wxinfo = JSON.parse(args.wxinfo);
    }
    let username = wxinfo.nickname;
    let headurl = wxinfo.headimgurl;
    const params =[
        headurl,
        username,
        args.mobile,
        new Date(),
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        new_password,
        'member',    //用户角色
        args.desc?args.desc:null,//描述
        args.sex?args.sex:null,
        args.birthday?new Date(args.birthday):null,
        args.address?args.address:null,
        args.email?args.email:null,
        wxinfo, //微信用户信息
    ];
    redisClient.hmget('userCode'+phone,'randomNum',function(err,reply){//查短信验证码
        console.log('~~~~~~~~~~~~~~~~~~~~~~~');
        console.log(reply);
        if(reply[0] ==args.code ) {//对比短息验证码
            users.bind_mobile(params,args, function (err, result) {//去models中执行修改密码操作
                if(err){
                    log.debug(err);
                    res.send({success:false,data:err});
                }else{
                    if(result==null){
                        log.error('绑定手机号失败');
                        res.send({success:false,data:"绑定手机号失败！"});
                    }
                    else if(result.rowCount>=1){
                        res.send({success:true,data:"绑定手机号成功！"});
                    }
                    else if(result=='null'){
                        res.send({success:false,data:"您的用户尚未注册！"});
                    }
                    else if(result=='exit_mobile'){
                        res.send({success:false,data:"您的账号已经绑定手机号，请不要重复绑定！"});
                    }else{
                        log.error('绑定手机号失败');
                        res.send({success:false,data:"绑定手机号失败！"});
                    }
                }
            });
        }else {
            return res.send({success:false,data:'验证码错误，请重试！'});
        }
    });
};
/**
 * 用户上传手机通讯录
 * @param req
 * @param res
 */
exports.up_phone = function(req, res){
    const args = req.body;
    // if(!args.phone){
    //     return res.send({success:false,data:'请选择要上传的手机联系人'});
    // }
    // if(args.phone.constructor != Array){
    //     return res.send({success:false,data:'请按照正确格式上传联系人'});
    // }
    if(!args.phone){//一字符串形式传，用split转成数组
        return res.send({success:false,data:'请选择要上传的手机联系人'});
    }
    users.up_phone(args, req, function(err, result){//去models执行添加通讯录记录
        if(err){
            return res.send({success:false,data:err});//报错
        }else if(result == 'fail'){
            return res.send({success:false,data:'上传通讯录失败，请重试'});
        }else {
            return res.send({success:true,data:'上传通讯录成功'});
        }
    })
};
/**
 * 联系人好友
 * @param req
 * @param res
 */
exports.phone_user = function(req, res){
    const args = req.query;
    const limit = Number(args.limit);
    const page = Number(args.page);
    if(!limit){
        return res.send({success:false,data:'请选择每页显示多少条'});
    }
    if(!page){
        return res.send({success:false,data:'请选择当前页数'});
    }
    const params = [
        1,
        limit,
        (page-1)*limit
    ];
    users.phone_user(params, req, function(err, result){//去models执行查看联系人操作
        if(err){
            return  res.send({success:false,data:err});//报错
        }else if(result == 'null'){
            return res.send({success:true,data:['您还没有上传通信录']});
        }else {
            return res.send({success:true,data:result});//返回经过处理后的数据
        }
    })
};